package com.moli.iov.gateway.util;

import com.moli.iov.cache.RedisUtil;
import com.moli.iov.util.SnowflakeUtils;
import com.moli.iov.util.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.net.SocketException;

/**
 * <p>
 *  vin 路由 表
 *  记录当前vin 连接在哪个网关节点上
 * </p>
 *
 * @author: zql
 * @Date: 2019/4/18 16:23
 */
@Component("vinRouter")
public class VinRouter {

    private static final Logger logger = LoggerFactory.getLogger(VinRouter.class);

    @Autowired
    private RedisUtil redisUtil;

    private static final String VIN_ROUTER_KEY = "IOV:VEHICLE:ROUTER:";

    /**
     * 路由值
     */
    private static final String ROUTING_ID = SnowflakeUtils.getId();

    /**
     * 设置路由表
     * @param vin
     * @throws SocketException
     */
    public void setRoutingTable(String vin) {
        try{
            logger.info("设置路由表 vin:{} ID:{}", vin, ROUTING_ID);
            redisUtil.set(getKey(vin), ROUTING_ID);
        }catch(Exception e){
            logger.error("设置路由表 异常", e);
        }

    }

    /**
     * 判断是否是本地ID
     * @param vin
     * @return
     */
    public boolean isLocalID(String vin) {
        try{
            String cacheID = redisUtil.get(getKey(vin));
            if(StringUtil.isBlank(cacheID)){
                logger.error("判断是否是本地ID [结果] 失败， 缓存ID 为空 vin:{}", vin);
                return true;
            }

            if(!cacheID.equals(ROUTING_ID)){
                logger.error("判断是否是本地ID [结果] false vin:{} cacheID:{}  ID:{}", vin, cacheID, ROUTING_ID);
                return false;
            }

            logger.info("判断是否是本地ID [结果] true vin:{} cacheID:{}  ID:{}", vin, cacheID, ROUTING_ID);
            return true;
        }catch (Exception e){
            logger.error("判断是否是本地ID 异常", e);
            return true;
        }
    }


    /**
     * 返回redis key
     * @param vin
     * @return
     */
    public String getKey(String vin){
        return VIN_ROUTER_KEY + vin;
    }
}
